#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>

using namespace std;

//基于fcntl, 我们实现一个SetNoBlock函数, 将文件描述符设置为非阻塞.
void SetNonBlock(int fd)
{
    int fl=fcntl(fd,F_GETFL);
    if(fl<0)
    {
        perror("fcntl");
        return ;
    }
    fcntl(fd,F_SETFL,fl|O_NONBLOCK);
    cout<<"set "<<fd<<"nonblock done"<<endl;
}

//阻塞IO
int main()
{   
    char buffer[1024];
    //将0号文件描述符设置为非阻塞
    SetNonBlock(0);
    sleep(1);
    while(true)
    {
        //cout<<"Please Enter#"<<endl;
        printf("Please Enter# ");
        fflush(stdout);
        
        ssize_t n=read(0,buffer,sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n-1]=0;
            cout<<"echo: "<<buffer<<endl;
        }
        else if(n==0)
        {
            cout<<"read done"<<endl;
        }
        else 
        {
            //1.设置为非阻塞，如果底层的fd数据没有就绪，recv/read/write/send，
            //返回值就会以出错的形式返回
            //2.1.真的出错了
            //2.2.底层没有就绪，我们通过errno区分
            //如果错误码是11就表示底层没有就绪
            if(errno==EWOULDBLOCK)
            {
                cout<<"0 fd data not ready,try again"<<endl;
            }
            else
            {
                cerr<<"read error"<<endl;
            }
            sleep(1);
        }
    }
    return 0;
}